package a03;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * 自定义后置处理器
 * 前面的学习中，我们知道在spring中，对于@Autowired、@Resource、@Value等注解的解析，都是通过
 * 各种后处理器去解析的，在后处理器中完成依赖注入、初始化等等各类的工作。
 * 这里我们自定义后处理器，来了解bean的生命周期，和各个阶段可以做的工作
 */
@Component   //添加到容器中，就会生效
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if ("lifeCycleBean".equals(beanName)) {
            System.out.println("实例化前的处理");
        }
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if ("lifeCycleBean".equals(beanName)) {
            System.out.println("实例化后，依赖注入前的处理...");
        }
        return true;
    }


    /**
     * 可以看到AutowiredAnnotationBeanPostProcessor实现了这个方法，在这个方法里将传入的属性值注入到了bean里。
     */
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if ("lifeCycleBean".equals(beanName)) {
            System.out.println("依赖注入(包括@Autowired、@Value、@Resource)");
        }
        return pvs;
    }

    /**
     * 看注解的解释是在依赖注入之后、初始化之前调用(初始化是指比如：afterPropertiesSet)
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if ("lifeCycleBean".equals(beanName)) {
            System.out.println("初始化之前>>>>>@PostConstruct、@ConfigurationProperties都是在这个阶段");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if ("lifeCycleBean".equals(beanName)) {
            System.out.println("初始化之后>>>>>如代理增强");
        }
        return bean;    }
}
